//
//  UserManager.h
//  ENTBoostKit
//
//  Created by zhong zf on 14-6-27.
//
//

#import "AbstractManager.h"

@class EBEnterpriseInfo;
@class EBVCard;
@class EBServerInfo;
@class EBContactInfo;

@interface UserManager : AbstractManager <SOTPClientDelegate>

/**登记用户在线
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param loginType 登录类型
 * @param state 在线状态
 * @param usId 用户客户端标识，由服务端生成返回，客户端本地保存，用于标识用户终端硬件或浏览器等
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)onlineWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey loginType:(enum EB_LOGON_TYPE)loginType state:(enum EB_USER_LINE_STATE)state usId:(NSString*)usId success:(void(^)(NSString* usId, uint64_t entId, uint64_t entDepInfoVer, uint64_t myGroupInfoVer))successBlock failure:(SOTPFailureBlock)failureBlock;

/**登记用户在线
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)offlineWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey success:(void(^)(void))successBlock failure:(SOTPFailureBlock)failureBlock;

/**加载资源（组织架构[不包括成员]、表情资源）
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param entSuccessBlock 组织架构加载完成后回调函数
 * @param emotionBeginBlock 表情资源加载开始回调函数
 * @param emotionCompletionBlock 表情资源加载完成后回调函数
 * @param failure 失败后回调函数
 */
- (void)loadResourceInfoWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey entSuccess:(void(^)(EBEnterpriseInfo* enterpriseInfo, NSDictionary* entGroupInfos, NSDictionary* personalGroupInfos))entSuccessBlock emotionBegin:(void(^)(NSArray* expressions, NSArray* headPhotos))emotionBeginBlock emotionCompletion:(void(^)(NSArray* expressions, NSArray* headPhotos))emotionCompletionBlock failure:(SOTPFailureBlock)failureBlock;

/**加载企业本身信息
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param successBlock 加载完成后回调函数
 * @param failureBlock 失败后回调函数
 */
- (void)loadEnterpriseInfoWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey success:(void(^)(EBEnterpriseInfo* enterpriseInfo))successBlock failure:(SOTPFailureBlock)failureBlock;

/**加载企业部门和个人群组
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param depCode 部门编号
 * @param successBlock 加载完成后回调函数
 * @param failureBlock 失败后回调函数
 */
- (void)loadGroupInfosWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey depCode:(uint64_t)depCode success:(void(^)(NSDictionary* entGroupInfos, NSDictionary* personalGroupInfos))successBlock failure:(SOTPFailureBlock)failureBlock;

/**加载企业部门
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param depCode 部门编号
 * @param successBlock 加载完成后回调函数
 * @param failureBlock 失败后回调函数
 */
- (void)loadEntGroupInfosWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey depCode:(uint64_t)depCode success:(void(^)(NSDictionary* entGroupInfos))successBlock failure:(SOTPFailureBlock)failureBlock;

/**加载个人群组
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param depCode 部门编号
 * @param successBlock 加载完成后回调函数
 * @param failureBlock 失败后回调函数
 */
- (void)loadPersonalGroupInfosWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey depCode:(uint64_t)depCode success:(void(^)(NSDictionary* personalGroupInfos))successBlock failure:(SOTPFailureBlock)failureBlock;

/**加载指定部门或群组成员
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param depCode 部门或群组编码
 * @param successBlock 组织架构加载完成后回调函数
 * @param failureBlock 失败后回调函数
 */
- (void)loadMemberInfosWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey depCode:(uint64_t)depCode success:(void(^)(NSDictionary* memberInfos))successBlock failure:(SOTPFailureBlock)failureBlock;

/**加载表情和头像资源
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param beginBlock 加载开始时回调函数
 * @param completionBlock 加载完成后回调函数
 * @param failureBlock 失败后回调函数
 */
- (void)loadEmotionsWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey onBegin:(void(^)(NSArray* expressions, NSArray* headPhotos))beginBlock onCompletion:(void(^)(NSArray* expressions, NSArray* headPhotos))completionBlock failure:(SOTPFailureBlock)failureBlock;

/**加载动态数据(离线信息、用户通知、应用订购关系、部门版本号、个人群组版本号)
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param isLoadMsg 是否加载离线信息、用户通知
 * @param isLoadSubFunc 是否加载订购应用关系
 * @param isLoadGroupVersion 是否加载企业部门和个人群组版本号
 * @param successBlock API本身调用返回正确状态后回调函数(不用等待后续数据加载完成才触发)
 * @param subFuncloadedBlock 加载应用订购关系完成时回调函数
 * @param groupVersionInfosLoadedBlock 加载部门和群组版本号完成时回调函数
 * @param failure 失败后回调函数
 */
- (void)loadInfoWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey isLoadMsg:(BOOL)isLoadMsg isLoadSubFunc:(BOOL)isLoadSubFunc isLoadGroupVersion:(BOOL)isLoadGroupVersion success:(void(^)(void))successBlock subFuncloadedBlock:(void(^)(void))subFuncloadedBlock groupVersionInfosLoadedBlock:(void(^)(uint64_t entGroupVer, uint64_t personalGroupVer, NSDictionary* entGroupVersionInfos, NSDictionary* personalGroupVersionInfos))groupVersionInfosLoadedBlock failure:(SOTPFailureBlock)failureBlock;

/**加载联系人信息
 * @param uid 用户唯一编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)loadContactInfoWithUid:(uint64_t)uid onlineKey:(NSString*)onlineKey success:(void(^)(NSDictionary* contactInfos))successBlock failure:(SOTPFailureBlock)failureBlock;

/**新增/修改联系人信息
 * @param contactInfo 联系人信息实例
 * @param uid 用户编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)editContactInfo:(EBContactInfo*)contactInfo ForUid:(uint64_t)uid onlineKey:(NSString*)onlineKey success:(void(^)(void))successBlock failure:(SOTPFailureBlock)failureBlock;

/**删除联系人信息
 * @param contact 联系人账号
 * @param uid 用户编号
 * @param onlineKey 用户在线状态key(动态令牌)
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)delConactInfoWithContact:(NSString*)contact ForUid:(uint64_t)uid onlineKey:(NSString*)onlineKey success:(void(^)(void))successBlock failure:(SOTPFailureBlock)failureBlock;

/**发起呼叫请求
 * @param fromUid 发起邀请方用户编号
 * @param toUid 被邀请方用户编号 
 * @param memberCode 被邀请成员代码(部门或群组成员)
 * @param depCode 部门或群组代码
 * @param oldCallId 合并旧会话到新会话时使用的会话编号
 * @param existCallId 已有的会话编号
 * @param c2d 请求转换为临时讨论组, 默认0=不请求转换, 1=请求会话转临时讨论组
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)cCall:(uint64_t)fromUid toUid:(uint64_t)toUid memberCode:(uint64_t)memberCode depCode:(uint64_t)depCode oldCallId:(uint64_t)oldCallId existCallId:(uint64_t)existCallId c2d:(int16_t)c2d success:(void(^)(uint64_t callId,enum EB_ACCOUNT_TYPE fType, BOOL autoAccept))successBlock failure:(SOTPFailureBlock)failureBlock;

/**响应呼叫请求
 * @param fromUid 发起邀请方用户编号
 * @param callId 会话编号
 * @param ackType 邀请响应: 1=接受,2=拒绝
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)cAck:(uint64_t)fromUid callId:(uint64_t)callId ackType:(int16_t)ackType success:(void(^)(EBServerInfo* umServerInfo, NSString* umKey))successBlock failure:(SOTPFailureBlock)failureBlock;

/**进入会话状况
 * @param fromUid 发起邀请方用户编号
 * @param callId 会话编号
 * @param depCode 部门或群组代码
 * @param umKey 进入UM会话令牌
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)cEnter:(uint64_t)fromUid callId:(uint64_t)callId depCode:(uint64_t)depCode umKey:(NSString*)umKey success:(void(^)(EBServerInfo* cmServerInfo, NSString* cmKey, uint64_t chatId))successBlock failure:(SOTPFailureBlock)failureBlock;

/**退出会话
 * @param fromUid 发起邀请方用户编号
 * @param callId 会话编号
 * @param hangup 是否挂断会话, FALSE=退出会话,TRUE=挂断会话(只用于一对一会话)
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)cHangup:(uint64_t)fromUid callId:(uint64_t)callId hangup:(BOOL)hangup success:(void(^)(void))successBlock failure:(SOTPFailureBlock)failureBlock;

@end

///回调代理
@protocol UserManagerDelegate<AbstractManagerDelegate>
@optional

/**对方用户邀请对话事件
 * @param callId 会话编号
 * @param oldCallId 会话编号
 * @param fromUid 响应邀请用户的ID
 * @param fromAccount 响应邀请用户的账号
 * @param vCard 电子名片
 * @param depCode 部门或群组编号
 * @param address 用户登录地址信息
 * @param autoAccept 服务端是否已经自动应答该呼叫
 * @param fromServerAddress 来源服务地址
 */
- (void)onFCCall:(uint64_t)callId oldCallId:(uint64_t)oldCallId fromUid:(uint64_t)fromUid fromAccount:(NSString*)fromAccount vCard:(EBVCard*)vCard depCode:(uint64_t)depCode address:(NSString*)address autoAccept:(BOOL)autoAccept fromServerAddress:(NSString*)fromServerAddress;

/**对方用户响应邀请对话事件
 * @param callId 会话编号
 * @param fromUid 响应邀请用户的ID
 * @param fromAccount 响应邀请用户的账号
 * @param vCard 电子名片
 * @param ackType 邀请结果: 1=接受,2=拒绝,3=用户离线,4=呼叫超时
 * @param address 用户登录地址信息
 * @param umKey UM服务访问动态令牌
 * @param fromServerAddress 来源服务地址
 */
- (void)onFCAck:(uint64_t)callId fromUid:(uint64_t)fromUid fromAccount:(NSString*)fromAccount vCard:(EBVCard*)vCard ackType:(int16_t)ackType address:(NSString*)address umKey:(NSString*)umKey fromServerAddress:(NSString*)fromServerAddress;

/**对方用户响应邀请对话事件
 * @param callId 会话编号
 * @param fromUid 响应邀请用户的ID
 * @param hangup 是否挂断会话, FALSE=退出会话,TRUE=对方主动挂断会话
 * @param fromServerAddress 来源服务地址
 */
- (void)onFCHangup:(uint64_t)callId fromUid:(uint64_t)fromUid hangup:(BOOL)hangup fromServerAddress:(NSString*)fromServerAddress;

///**会话中对方用户需要被呼叫一下
// * @param callId 会话编号
// * @param fromUid 响应邀请用户的ID
// * @param fromServerAddress 来源服务地址
// */
//- (void)onUserNeedCall:(uint64_t)callId fromUid:(uint64_t)fromUid fromServerAddress:(NSString*)fromServerAddress;

/**离线信息事件
 * @param msgId 消息编号
 * @param fromUid 发起消息通知的用户编号
 * @param fromAccount 发起消息通知的用户账号
 * @param msgType 消息类型
 * @param msgSubType 富文本消息子类型
 * @param msgName 名称
 * @param msgContent 消息内容
 * @param depCode 部门或群组编号
 * @param vCard 电子名片
 * @param fromServerAddress 来源服务地址
 */
- (void)onOfflineMessage:(uint64_t)msgId fromUid:(uint64_t)fromUid fromAccount:(NSString*)fromAccount msgType:(enum EB_MSG_TYPE)msgType msgSubType:(enum EB_RICH_SUB_TYPE)msgSubType msgName:(NSString*)msgName msgContent:(NSString*)msgContent depCode:(uint64_t)depCode vCard:(EBVCard*)vCard fromServerAddress:(NSString*)fromServerAddress;

///**接收到版本数据事件
// * @param versionData 表现部门或群组成员数据变更的版本 {key=depCode[NSNumber], entity=versionNo[NSNumber]}
// * @param groupInfoVersion 表现部门或群组本身数据变更的版本
// * @param isEntGroup 上述数据是企业部门还是个人群组数据；YES=企业部门，NO=个人群组
// */
//- (void)onReceiveVersionsData:(NSDictionary*)versionsData groupInfoVersion:(uint64_t)groupInfoVersion isEntGroup:(BOOL)isEntGroup;

/**表情或头像资源加载事件
 * @param msgContent 消息内容
 * @param emoCount 资源数量，>=0表示本次值有效
 * @param cid 调用编号
 * @param beginBlock  加载开始时回调函数
 * @param completionBlock 加载完成后回调函数
 * @param fromServerAddress 来源服务地址
 */
- (void)onEmotion:(NSString*)msgContent emoCount:(int)emoCount cid:(uint32_t)cid onBegin:(void(^)(NSArray* expressions, NSArray* headPhotos))beginBlock onCompletion:(void(^)(NSArray* expressions, NSArray* headPhotos))completionBlock fromServerAddress:(NSString*)fromServerAddress;


@end